package d0623;

import java.sql.*;

public class JDBC测试 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		/**
		 * 1. 加载驱动
		 * 2. 获取连接
		 * 3. 创建语句
		 * 4. 执行语句
		 * 5. 关闭连接
		 */
		
		System.out.println("==========S=========");
		queryLikeEname("%S%");
		System.out.println("==========A=========");
		queryLikeEname("%A%");
		System.out.println("====== 注入攻击  ======");
		queryLikeEname("' or '1'='1");
		
		
	}

	public static void queryLikeEname(String en) throws ClassNotFoundException, SQLException {
		// 查询语句 ( 预编译语句的使用)
		/**
		 * 预编译语句对象的优势
		 * 	1. 安全性高
		 * 	2. 执行效率高
		 */
		Class.forName("oracle.jdbc.driver.OracleDriver");
		// 获取连接   本地地址 :  localhost(域名)   127.0.0.1(ip地址)  1521 默认端口
		String url = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
		String user = "scott";
		String password = "a";
		Connection conn = DriverManager.getConnection(url, user, password);
		//  ? 参数占位符
		String sql = "select * from emp where ename like ? ";
		//创建预编译语句对象
		PreparedStatement ps = conn.prepareStatement(sql);
		// 给参数占位符赋值
		ps.setString(1, en);
		//专门用户查询的方法  调用不传sql遇见的方法
		ResultSet rs = ps.executeQuery();
		// 返回 boolean true: 进入下一行, false, 没有数据了
		while (rs.next()) {
			int empno = rs.getInt("EMPNO"); // oracle 驱动会将字段名转成大写
			String ename = rs.getString(2); // 序号从 1 开始
			java.sql.Date hiredate = rs.getDate(5); // 日期    java.sql.Date 是 java.util.Date 的子类
			double sal = rs.getDouble("SAL");
			System.out.printf("%4d %20s %20s %10.2f\n", empno, ename, hiredate, sal);
		}
		conn.close();
	}

	public static void test2() throws ClassNotFoundException, SQLException {
		// 加载驱动
		// class 类对象获取的方式: 1. 对象.getClass()  2. 类.class  3. Class.forName(); 
		Class.forName("oracle.jdbc.driver.OracleDriver");

		// 获取连接   本地地址 :  localhost(域名)   127.0.0.1(ip地址)  1521 默认端口
		String url = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
		String user = "scott";
		String password = "a";
		Connection conn = DriverManager.getConnection(url, user, password);

		// 创建普通的语句对象
		Statement stat = conn.createStatement();

		String sql = "update dept set loc='北京' where deptno = 99";

		int cnt = stat.executeUpdate(sql);
		System.out.printf("更新了%d部门\n", cnt);

		// 关闭语句对象
		stat.close();

		stat = conn.createStatement();

		sql = "delete dept a where not exists (select * from emp b where a.deptno=b.deptno)";

		cnt = stat.executeUpdate(sql);
		System.out.printf("删除了%d部门\n", cnt);

		conn.close();
	}

	public static void test1() throws ClassNotFoundException, SQLException {
		// 加载驱动
		// class 类对象获取的方式: 1. 对象.getClass()  2. 类.class  3. Class.forName(); 
		Class.forName("oracle.jdbc.driver.OracleDriver");

		// 获取连接   本地地址 :  localhost(域名)   127.0.0.1(ip地址)  1521 默认端口
		String url = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
		String user = "scott";
		String password = "a";
		Connection conn = DriverManager.getConnection(url, user, password);

		// 创建普通的语句对象
		Statement stat = conn.createStatement();

		String sql = "insert into dept values(99, '科技部' , '衡阳')";

		// 执行语句   executeUpdate 除了不能执行查询语句, 其他语句都可以, DDL DCL TCL
		int cnt = stat.executeUpdate(sql);
		System.out.printf("新增了%d部门\n", cnt);

		// 关闭连接  关闭连接会附带关闭该连接创建语句对象
		stat.close();
		conn.close();

	}

}
